package com.example.tomatotodo;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.tomatotodo.R;
import com.example.tomatotodo.api.ApiClient;
import com.example.tomatotodo.api.ApiService;
import com.example.tomatotodo.model.Result;
import com.example.tomatotodo.model.UserUpdateDTO;
import com.example.tomatotodo.util.MD5Utils;
import com.example.tomatotodo.util.TokenManager;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class UpdateFragment extends Fragment {
    private static final String TAG = "UpdateFragment";
    private EditText etUsername;
    private EditText etOldPassword;
    private EditText etNewPassword;
    private Button btnUpdate;
    private TextView tvBack;
    private ApiService userApi;
    private String newUsername; // 新增：用于保存提交时输入的用户名


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 1. 加载 activity_update 布局
        View view = inflater.inflate(R.layout.activity_update, container, false);

        // 2. 初始化视图（从包含的布局中获取输入框）
        initViews(view);

        // 新增：加载已保存的用户名到输入框
        loadUserInfo();

        // 3. 初始化API和点击事件
        userApi = ApiClient.getClient().create(ApiService.class);
        setClickListeners();

        return view;
    }

    private void initViews(View view) {
        // 获取包含的输入布局
        View inputLayout = view.findViewById(R.id.update_input_layout);
        if (inputLayout != null) {
            // 从输入布局中获取用户名、旧密码、新密码输入框（假设 register_input_layout 中包含这些ID）
            etUsername = inputLayout.findViewById(R.id.et_username);
            etOldPassword = inputLayout.findViewById(R.id.et_old_password);
            etNewPassword = inputLayout.findViewById(R.id.et_new_password);
        }
        // 获取页面按钮
        btnUpdate = view.findViewById(R.id.btn_update);
        tvBack = view.findViewById(R.id.tv_back);
    }

    private void setClickListeners() {
        // 更新按钮点击事件
        btnUpdate.setOnClickListener(v -> updateProfile());

        // 返回按钮点击事件
        tvBack.setOnClickListener(v -> {
            // 返回上一页面
            if (getActivity() != null) {
                getActivity().onBackPressed();
            }
        });
    }
    // 新增：从SharedPreferences加载用户名并显示
    private void loadUserInfo() {
        if (getActivity() == null) return;

        // 读取LoginFragment中保存的用户信息（"user_info"为SharedPreferences名称，"username"为键）
        SharedPreferences prefs = getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);
        String savedUsername = prefs.getString("username", ""); // 第二个参数为默认值（空字符串）

        // 将用户名填充到输入框
        if (etUsername != null && !savedUsername.isEmpty()) {
            etUsername.setText(savedUsername);
            // 光标定位到文本末尾（优化用户体验）
            etUsername.setSelection(savedUsername.length());
        }
    }

    // 4. 保留原有的 updateProfile 逻辑（输入验证、API调用等）
    private void updateProfile() {
        // 获取输入值（从新的视图引用中获取）
        String username = etUsername != null ? etUsername.getText().toString().trim() : "";
        String oldPassword = etOldPassword != null ? etOldPassword.getText().toString().trim() : "";
        String newPassword = etNewPassword != null ? etNewPassword.getText().toString().trim() : "";
        newUsername = username; // 保存提交时的用户名（用于后续保存到本地）
        // 输入验证（与之前逻辑一致）
        if (isInputValid(oldPassword, newPassword)) {
            UserUpdateDTO updateDTO = new UserUpdateDTO();
            updateDTO.setUsername(username);
            // 新增：对非空的旧密码进行MD5加密（与登录逻辑一致）

            if (!oldPassword.isEmpty()) {
                String encryptedOldPwd = MD5Utils.md5(oldPassword);
                updateDTO.setOldPassword(encryptedOldPwd);
            }

            // 新增：对非空的新密码进行MD5加密（与登录逻辑一致）
            if (!newPassword.isEmpty()) {
                String encryptedNewPwd = MD5Utils.md5(newPassword);
                updateDTO.setNewPassword(encryptedNewPwd);
            }

            // Token获取与API调用（与之前逻辑一致）
            String token = TokenManager.getToken(getActivity());
            if (token == null) {
                Toast.makeText(getActivity(), "请先登录", Toast.LENGTH_SHORT).show();
                return;
            }

            Call<Result<Void>> call = userApi.updateProfile("Bearer " + token, updateDTO);
            call.enqueue(new Callback<Result<Void>>() {
                @Override
                public void onResponse(Call<Result<Void>> call, Response<Result<Void>> response) {
                    handleUpdateResponse(response);
                }

                @Override
                public void onFailure(Call<Result<Void>> call, Throwable t) {
                    Log.e(TAG, "更新失败: " + t.getMessage());
                    Toast.makeText(getActivity(), "网络错误，更新失败", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    // 保留原有辅助方法（isInputValid、handleUpdateResponse等）
    private boolean isInputValid(String oldPassword, String newPassword) {
        // 原有验证逻辑：修改密码时需同时输入新旧密码
        if ((!oldPassword.isEmpty() && newPassword.isEmpty()) || (oldPassword.isEmpty() && !newPassword.isEmpty())) {
            Toast.makeText(getActivity(), "修改密码时需同时输入旧密码和新密码", Toast.LENGTH_SHORT).show();
            return false;
        }

        // 新增：旧密码非空时，校验长度至少6位
        if (!oldPassword.isEmpty() && oldPassword.length() < 6) {
            Toast.makeText(getActivity(), "旧密码至少6位", Toast.LENGTH_SHORT).show();
            return false;
        }

        // 新增：新密码非空时，校验长度至少6位
        if (!newPassword.isEmpty() && newPassword.length() < 6) {
            Toast.makeText(getActivity(), "新密码至少6位", Toast.LENGTH_SHORT).show();
            return false;
        }

        return true;
    }

    private void handleUpdateResponse(Response<Result<Void>> response) {
        if (response.isSuccessful() && response.body() != null) {
            Result<Void> result = response.body();
            if (result.getCode() == 200) {
                // 新增：更新本地SharedPreferences中的用户名 (同步服务器最新数据)
                if (getActivity() != null && newUsername != null && !newUsername.isEmpty()) {
                    SharedPreferences prefs = getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putString("username", newUsername); // 保存新用户名
                    editor.commit(); // 强制同步提交，确保立即生效
                    Log.d(TAG, "本地用户名已更新: " + newUsername);
                }

                Toast.makeText(getActivity(), "更新成功", Toast.LENGTH_SHORT).show();
                if (getActivity() != null) {
                    getActivity().onBackPressed();
                }
            } else {
                String errorMsg = result.getMessage() != null ? result.getMessage() : "更新失败";
                Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getActivity(), "更新失败，服务器错误", Toast.LENGTH_SHORT).show();
        }
    }
}